'''
对下载的shp压缩包进行处理。下载文件为“地块名称_地理信息.zip”命名
1. 根据文件名称和code对应的数据，轮询去下载shp文件中寻找对应文件。
2. 解压下载的文件，使用os.walk找到有shp文件的目录。
3. 找到需要的shp文件，转到一个临时文件夹。
4. 对临时文件夹压缩成zip文件，以code命名，并保存到目的文件夹中。
'''
import os
import shutil
from my_tools.shpfile_convert.utils.logger_util import log
from my_tools.shpfile_convert.utils.compress_util import makezip,unCompress

# 获取当前路径
cpath = os.getcwd()
# 原始文件的存放目录
ofpath = cpath+'\\old'
# 处理完成后文件的存放目录
nfpath = cpath+'\\new'
# 打开文件进行操作
fpath = cpath+'\\file.txt'

# 寻找文件名称，并重命名 未使用到了
def findAndRename(file,ext):
    ischange = False
    with open(fpath, 'r+',encoding='utf-8') as f:
        lines = f.readlines()
        for i in range(len(lines)):
            line = lines[i]
            if line.startswith('--'):
                continue

            name,code=line.split(',')
            if name in file:
                code = code.replace('\n','')
                # 重命名文件
                os.rename(os.path.join(ofpath, file), os.path.join(nfpath, code+ext))
                lines[i] = '--' + lines[i] 
                log.info('处理文件：%s -> %s' % (file,code))
                ischange = True
                break
        f.seek(0)
        f.writelines(lines)
    return ischange

# 根据文件名称获取文件的code信息，用于重命名
def getFileCodeName(file):
    rcode = ''
    with open(fpath, 'r',encoding='utf-8') as f:
        for line in f.readlines():
            if line.startswith('--'):
                continue
            name,code=line.split(',')
            if name in file:
                rcode = code.replace('\n','')
                break
    return rcode
            
# 标记已经处理标识
def checkFileHasDeal(code):
    with open(fpath, 'r+',encoding='utf-8') as f:
        lines = f.readlines()
        for i in range(len(lines)):
            if lines[i].startswith('--'):
                continue
            if code in lines[i]:
                lines[i] = '--' + lines[i] 
                break
        f.seek(0)
        f.writelines(lines)

# 处理压缩文件
def unzipAndDeal(file, ziptemppath):
    # 解压文件
    filepath = os.path.join(ofpath, file)
    # 解压文件到指定目录
    temppath = ofpath + '\\temp'
    unCompress(filepath, temppath)

    # 抓取需要打包的文件到指定目录
    for dirpath,dirnames,filenames in os.walk(temppath):
        # 如果该层级下没有文件，则寻找下一级
        if not filenames:
            continue
        for filename in filenames:     
            # 判断如果是shp所需文件的时候，转移到待压缩目录
            if '.dbf' in filename or '.prj' in filename or '.sbn' in filename or '.sbx' in filename or '.shp' in filename or '.shx' in filename:
                cfile = os.path.join(dirpath, filename)
                ziptempfilepath = os.path.join(ziptemppath,filename)
                shutil.move(cfile, ziptempfilepath)

    # 删除缓存目录
    shutil.rmtree(temppath)
    return ziptemppath

# 判断筛选出的shp文件是否正确，不正确的记录到错误日志
def checkshpfile(temppath, file):
    filelist = os.listdir(temppath)
    if len(filelist) < 4:
        log.error('%s > 存在问题,文件中没有shp数据' % file)
        return False
    # shp文件至少包含dbf、shp，shx、prj 4个文件
    fileliststr = ''.join(filelist)
    if '.dbf' in fileliststr and '.shp' in fileliststr and '.shx' in fileliststr and '.prj' in fileliststr:
        return True
    else:
        log.error('%s > 文件shp文件不完整，请检查' % file)
        return False

# 计数
docount=0
notcount=0
skipcount=0

# 缓存压缩文件的目录
ziptemppath = nfpath + '\\temp'

# 原文件列表
dirs = os.listdir(ofpath)
for file in dirs:
    try:
        # 获取文件对应的地块编码
        code = getFileCodeName(file)
        if code == '':
            log.warning('【已转化或未匹配到CODE】%s' % file)
            skipcount += 1
            continue
        # 以地块编码为zip文件名,看改文件是否已经转化过
        newzippath = os.path.join(nfpath, code+'.zip')
        if os.path.exists(newzippath):
            log.warning('【已处理】%s' % file)
            skipcount += 1
            continue

        # 解压文件到temp目录，同时筛选出需要压缩的文件
        if os.path.exists(ziptemppath):
            shutil.rmtree(ziptemppath)
        os.mkdir(ziptemppath)
        unzipAndDeal(file, ziptemppath)

        # 判断筛选出的shp文件是否正确，不正确的记录到错误日志
        if(checkshpfile(ziptemppath, file)):
            # 重新压缩为zip文件
            makezip(ziptemppath, newzippath)
            docount += 1
            checkFileHasDeal(code)
            log.info('【处理完成】%s —> %s' % (file, code))
        else:
            notcount += 1
    except Exception as e:
        log.error('【处理错误】%s, error: %s' % (file, e))
        continue

log.info('共处理文件%s个。成功转化%s个，失败%s个，已转化跳过%s个' % (len(dirs),docount,notcount,skipcount))